package javaDemo.demo.mashibing.volatileStudy;

/**
 * @Description 双重检查的单例模式（需要加上volatile）
 * @Author
 * @Date 2021/2/21 16:19
 * @Version 1.0
 */
public class DoubleCheck {

    // 单例加上volatile
    private static volatile DoubleCheck INSTANCE;

    // 私有化构造器
    private DoubleCheck() {
    }

    public static DoubleCheck getInstance() {
        if (INSTANCE == null) {
            synchronized (DoubleCheck.class) {
                // 缩小加锁的范围，并且使用双重检查保证线程安全性
                if (INSTANCE == null) {
                    INSTANCE = new DoubleCheck();
                }
            }
        }
        return INSTANCE;
    }

    public static void main(String[] args) {
        // 检验一下单例是否成功
        for (int i = 0; i < 100; i++) {
            System.out.println(DoubleCheck.getInstance());
        }
    }

}
